package day27.homework;

/**
 * 创建3个线程。
 * 1. 分别输出1~10之间的数字及对应的输出数字线程名
 * 2. 线程优先级分别为最高、普通、最低
 * 3. 每个线程输出一次后，休眠一秒钟
 * 4. 思考是否每次都是优先级最高的线程先打印输出？
 * 
 * 线程优先级说明：
 * - Thread.MAX_PRIORITY = 10 (最高优先级)
 * - Thread.NORM_PRIORITY = 5 (普通优先级，默认优先级)
 * - Thread.MIN_PRIORITY = 1 (最低优先级)
 * 注意：线程优先级只是提示JVM调度器的建议，不能保证执行顺序
 */

public class hw10 {
    // 程序入口点
    public static void main(String[] args) {
        // 创建三个线程，分别设置不同的优先级
        // 每个线程实例化时传入线程名称，便于识别
        Thread highestPriorityThread = new NumberPrinter("最高优先级线程");
        Thread normalPriorityThread = new NumberPrinter("普通优先级线程");
        Thread lowestPriorityThread = new NumberPrinter("最低优先级线程");

        // 设置线程优先级
        // MAX_PRIORITY为最高优先级(值为10)
        highestPriorityThread.setPriority(Thread.MAX_PRIORITY); // 最高优先级 10
        // NORM_PRIORITY为普通优先级(值为5)，也是线程默认优先级
        normalPriorityThread.setPriority(Thread.NORM_PRIORITY); // 普通优先级 5
        // MIN_PRIORITY为最低优先级(值为1)
        lowestPriorityThread.setPriority(Thread.MIN_PRIORITY);  // 最低优先级 1

        // 启动线程，调用start()方法使线程进入就绪状态等待CPU调度
        // 注意：不是调用run()方法，而是start()方法
        highestPriorityThread.start();
        normalPriorityThread.start();
        lowestPriorityThread.start();
    }
}

// 数字打印线程类，继承Thread类实现多线程
class NumberPrinter extends Thread {
    // 构造方法，接收线程名称参数
    public NumberPrinter(String name) {
        // 调用父类Thread的构造方法设置线程名称
        super(name);
    }

    // 重写run方法，定义线程执行的任务
    @Override
    public void run() {
        // 循环10次，输出1到10的数字
        for (int i = 1; i <= 10; i++) {
            // 输出当前线程名称和当前数字
            // getName()方法获取线程名称
            System.out.println("线程名: " + getName() + ", 数字: " + i);
            try {
                // 每个线程输出一次后，休眠1秒钟(1000毫秒)
                // sleep()方法会让当前线程进入阻塞状态指定时间
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                // 捕获中断异常，当线程在sleep期间被其他线程中断时会抛出此异常
                // 打印异常堆栈信息
                e.printStackTrace();
            }
        }
    }
}